import 'dart:async';

import 'package:event_bus/event_bus.dart';

/**
 * @Description: 对 EventBus 进行封装使用
 * @Author: 下雨了
 * @CreateDate: 2021-11-25 14:08
 * @UpdateUser: 更新者
 * @UpdateDate:  2021-11-25 14:08
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
///
/*
   /// 使用示例

   /// 发送通知
   bus.fire(HomeEvent(widget.collectId, value!.status!, value.totalSign!));

   // 订阅事件 HomeEvent
  late StreamSubscription<HomeEvent> _homeEvent;

  @override
  void initState() {
    super.initState();

    /// 订阅事件 HomeEvent 处理
    _homeEvent = bus.listen((event) {
      _homeListModel.upSignData(event.collectId, event.status, event.totalSign);
    });
  }

  @override
  void dispose() {
    super.dispose();
    // 取消订阅
    _homeEvent.cancel();
  }

 */

//定义一个top-level（全局）变量，页面引入该文件后可以直接使用bus
var bus = EventBusUtils();

class EventBusUtils {
  EventBus? _eventBus;

  //获取单例
  EventBus? getInstance() {
    if (_eventBus == null) {
      _eventBus = EventBus();
    }
    return _eventBus;
  }

  //私有构造函数
  EventBusUtils._internal() {
    getInstance();
    print("EventBusUtils._internal()");
  }

  //保存单例
  static EventBusUtils _singleton = EventBusUtils._internal();

  //工厂构造函数
  factory EventBusUtils() => _singleton;

  //返回某事件的订阅者
  StreamSubscription<T> listen<T extends Event>(Function(T event) onData) {
    if (_eventBus == null) {
      _eventBus = EventBus();
    }
    //内部流属于广播模式，可以有多个订阅者
    return _eventBus!.on<T>().listen(onData);
  }

  //发送事件
  void fire<T extends Event>(T e) {
    if (_eventBus == null) {
      _eventBus = EventBus();
    }
    _eventBus!.fire(e);
  }

  // 摧毁
  void destroy(){
    if (_eventBus == null) {
      _eventBus = EventBus();
    }
    _eventBus!.destroy();
  }

}

/// 通用的 Event
abstract class Event {}


//==========================================================================================================================



/// 报名事件
/// 报名详情中，报名结束成功后 触发
class ApplyEvent extends Event {
  String collectId; // 任务id 用来判断是哪一条数据
  String status; // 报名状态 0未报名 1已报名
  String totalSign; // 已报名人数

  ApplyEvent(this.collectId, this.status, this.totalSign);
}
/// 采集任务事件
/// 任务详情，组长和组员在确认任务后触发
class CollectDetailEvent extends Event {
  String groupId; // 小组id 用来判断是哪一条数据
  String taskStatus; // 任务状态 用来显示
  String memberStatus; // 自身状态0未上传1待确认2已确认
  String totalProblem; // 上报问题数量

  CollectDetailEvent(this.groupId, this.taskStatus, this.memberStatus, this.totalProblem);
}

/// 效能动态刷新
class DynamicEvent extends Event {
  DynamicEvent();
}

/// 采集填报完成数量 + 1
class CollectAddNum extends Event {
  CollectAddNum();
}